home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 001-025 / 006 / dadc / dadc.c < prev   
C/C++ Source or Header  |  1995-03-13  |  7KB  |  262 lines

  1. /*
  2. **    d a d c
  3. **
  4. **    a digital computer impersonating an analog clock impersonating
  5. **    a digital clock.
  6. **            Copyright 1986
  7. **            By Perry S. Kivolowitz
  8. **
  9. **    Placed in the public domain with two restrictions:
  10. **
  11. **    (1) This header and the variable ``author'' not be modified
  12. **    (2) This program may not be used as part of ANY commercial
  13. **        product nor can any part of this code be used in any
  14. **        commercial product IN ANY WAY.
  15. **
  16. **    Timer code lifted from GfxMem by Lou M.
  17. */
  18.  
  19. static char *author = "perry s. kivolowitz";
  20.  
  21. #include <exec/types.h>
  22. #include <exec/nodes.h>
  23. #include <exec/lists.h>
  24. #include <exec/exec.h>
  25. #include <exec/execbase.h>
  26. #include <exec/ports.h>
  27. #include <exec/devices.h>
  28. #include <exec/memory.h>
  29. #include <devices/timer.h>
  30. #include <hardware/blit.h>
  31. #include <graphics/copper.h>
  32. #include <graphics/regions.h>
  33. #include <graphics/rastport.h>
  34. #include <graphics/gfxbase.h>
  35. #include <graphics/gfxmacros.h>
  36. #include <graphics/gels.h>
  37. #include <intuition/intuition.h>
  38.  
  39. struct IntuitionBase *IntuitionBase;
  40. struct GfxBase *GfxBase;
  41. struct Library *DiskfontBase;
  42.  
  43. struct Window *w;
  44.  
  45. struct MsgPort *timerport = NULL, *CreatePort();
  46. struct timerequest timereq;
  47. struct RastPort rps[10];
  48. struct BitMap bms[10];
  49.  
  50. long date[3];
  51. long *s = &date[1];
  52. #define    S     *s
  53.  
  54. struct TextFont *font;
  55. struct TextAttr sapphire = {
  56.     "sapphire.font" ,
  57.     19 ,
  58.     FS_NORMAL ,
  59.     FPF_DISKFONT | FPF_PROPORTIONAL | FPF_DESIGNED | FPF_ROMFONT
  60. };
  61.  
  62. #define    XMAX    100
  63. #define    YMAX    33
  64.  
  65. int is_cli;
  66. int close_flag = 0;
  67. int rast_count = 0;
  68.  
  69. #define    TIMER_DEVICE    0x0000001
  70. #define    TIMER_PORT    0x0000002
  71. #define    INTUITION    0x0000004
  72. #define    GFXLIB        0x0000008
  73. #define    THE_FONT    0x0000010
  74. #define    THE_WINDOW    0x0000020
  75. #define    FONTLIB        0x0000040
  76.  
  77. starttimer()
  78. {
  79.     timereq.tr_time.tv_secs = 59;
  80.     timereq.tr_time.tv_micro = 0;
  81.     timereq.tr_node.io_Command = TR_ADDREQUEST;
  82.     timereq.tr_node.io_Flags = 0;
  83.     timereq.tr_node.io_Error = 0;
  84.     timereq.tr_node.io_Message.mn_ReplyPort = timerport;
  85.     SendIO((char *) &timereq.tr_node);
  86. }
  87.  
  88. main(argc , argv)
  89. char *argv[];
  90. {
  91.     int i , flag = 0;
  92.     struct NewWindow nw;
  93.     struct IntuiMessage *msg , *GetMsg();
  94.     int waitmask;
  95.  
  96.     if (argc) is_cli = 1;
  97.  
  98.     IntuitionBase  = (struct IntuitionBase *) OpenLibrary("intuition.library" , 1);
  99.     if (!IntuitionBase) {
  100.         if (is_cli) printf("%s: could not open intuition library\n" , argv[0]);
  101.             exit(FALSE);
  102.     }
  103.     close_flag |= INTUITION;
  104.     GfxBase = (struct GfxBase *) OpenLibrary("graphics.library" ,  1);
  105.     if (!GfxBase) {
  106.             if (is_cli) printf("%s: could not open graphics library\n" , argv[0]);
  107.         close_stuff();
  108.         exit(FALSE);
  109.     }
  110.     close_flag |= GFXLIB;
  111.     DiskfontBase = (struct Library *) OpenLibrary("diskfont.library" , 0);
  112.     if (!DiskfontBase) {
  113.             if (is_cli) printf("%s: could not open disk font library\n" ,argv[0]);
  114.         close_stuff();
  115.         exit(FALSE);
  116.     }
  117.     close_flag |= FONTLIB;
  118.     if ((timerport = CreatePort("Timer Port", 0)) == NULL) {
  119.         close_stuff();
  120.         exit(1);
  121.     }
  122.     close_flag |= TIMER_PORT;
  123.     if (OpenDevice(TIMERNAME, UNIT_VBLANK, (char *) &timereq, 0) != 0) {
  124.         close_stuff();
  125.         exit(1);
  126.     }
  127.     close_flag |= TIMER_DEVICE;
  128.     font = OpenDiskFont(&sapphire);
  129.     if (!font) {
  130.         if (is_cli) printf("%s: cannot open disk font\n" , argv[0]);
  131.         close_stuff();
  132.         exit(1);
  133.     }
  134.     close_flag |= THE_FONT;
  135.  
  136.     nw.LeftEdge = nw.TopEdge = 20;
  137.     nw.Width = XMAX;
  138.     nw.Height = YMAX;
  139.     nw.DetailPen = 0;
  140.     nw.BlockPen = 1;
  141.     nw.Title = "DADC";
  142.     nw.Flags = NOCAREREFRESH | WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE | SMART_REFRESH;
  143.     nw.FirstGadget = NULL;
  144.     nw.CheckMark = NULL;
  145.     nw.IDCMPFlags = CLOSEWINDOW;
  146.     nw.Type = WBENCHSCREEN;
  147.     nw.Screen = NULL;
  148.     nw.BitMap = NULL;
  149.     nw.MinWidth = nw.MinHeight = nw.MaxWidth = nw.MaxHeight = 0;
  150.  
  151.     if (!(w = (struct Window *) OpenWindow(&nw))) {
  152.         if (is_cli) printf("%s: could not open window\n" , argv[0]);
  153.         close_stuff();
  154.         exit(1);
  155.     }
  156.     close_flag |= THE_WINDOW;
  157.     i = SetFont(w->RPort , font);
  158.     initialize_digits(font);
  159.     DateStamp(date);
  160.     scrollin(S % 10 , w->RPort , w->BorderLeft + 10 + (3 * (XMAX-20) / 4) , w->BorderTop , font->tf_YSize , font->tf_XSize);
  161.     scrollin((S / 10) % 6 , w->RPort , w->BorderLeft + 10 + (XMAX-20) / 2 , w->BorderTop , font->tf_YSize , font->tf_XSize);
  162.     scrollin((S / 60) % 10 , w->RPort , w->BorderLeft + 10 + (XMAX-20) / 4 , w->BorderTop , font->tf_YSize , font->tf_XSize);
  163.     S = (S / 60) > 9 ? 1 : 0;
  164.     scrollin(S , w->RPort , w->BorderLeft + 10 , w->BorderTop , font->tf_YSize , font->tf_XSize);
  165.     waitmask = (1 << w->UserPort->mp_SigBit) | (1 << timerport->mp_SigBit);
  166.     while (!flag) {
  167.         starttimer();
  168.         Wait(waitmask);
  169.         while (msg = GetMsg(w->UserPort)) {
  170.             switch (msg->Class) {
  171.  
  172.             case CLOSEWINDOW:
  173.                     flag = 1;
  174.                     break;
  175.             }
  176.             ReplyMsg(msg);
  177.         }
  178.         (void) GetMsg(timerport);
  179.         if (flag) continue;
  180.         DateStamp(date);
  181.         scrollin(S % 10 , w->RPort , w->BorderLeft + 10 + (3 * (XMAX-20) / 4) , w->BorderTop , font->tf_YSize , font->tf_XSize);
  182.         if (S % 10 == 0) scrollin((S / 10) % 6 , w->RPort , w->BorderLeft + 10 + (XMAX-20) / 2 , w->BorderTop , font->tf_YSize , font->tf_XSize);
  183.         if (S % 60 == 0) scrollin((S / 60) % 10 , w->RPort , w->BorderLeft + 10 + (XMAX-20) / 4 , w->BorderTop , font->tf_YSize , font->tf_XSize);
  184.         if (S % 60 != 0) continue;
  185.         S = S / 60;
  186.         if (S == 10) S = 1;
  187.         else if (S != 0) continue;
  188.         scrollin(S , w->RPort , w->BorderLeft + 10 , w->BorderTop , font->tf_YSize , font->tf_XSize);
  189.     }
  190.     close_stuff();
  191.     exit(1);
  192. }
  193.  
  194. close_stuff()
  195. {
  196.     if (close_flag & TIMER_DEVICE) {
  197.         AbortIO(&timereq);
  198.         CloseDevice(&timereq);
  199.     }
  200.     if (close_flag & TIMER_PORT) DeletePort(timerport);
  201.     if (close_flag & THE_WINDOW) CloseWindow(w);
  202.     if (close_flag & THE_FONT)   CloseFont(font);
  203.     deallocate_rasters();
  204.     if (close_flag & GFXLIB) CloseLibrary(GfxBase);
  205.     if (close_flag & FONTLIB) CloseLibrary(DiskfontBase);
  206.     if (close_flag & INTUITION) CloseLibrary(IntuitionBase);
  207.     (void) OpenWorkBench();
  208.     exit(TRUE);
  209. }
  210.  
  211. initialize_digits(font)
  212. struct TextFont *font;
  213. {
  214.     int i;
  215.     char *digits = "0123456789";
  216.  
  217.     for (i = 0; i < 10; i++) {
  218.         InitRastPort(&rps[i]);
  219.         InitBitMap(&bms[i] , 2 , 30 , 30);
  220.         bms[i].Planes[0] = AllocRaster(30 , 30);
  221.         if (bms[i].Planes[0] == NULL) {
  222.             close_stuff();
  223.             exit(1);
  224.         }
  225.         rast_count++;
  226.         bms[i].Planes[1] = AllocRaster(30 , 30);
  227.         if (bms[i].Planes[1] == NULL) {
  228.             close_stuff();
  229.             exit(1);
  230.         }
  231.         rast_count++;
  232.         rps[i].BitMap = &bms[i];
  233.         SetFont(&rps[i] , font);
  234.         SetRast(&rps[i] , 0);
  235.         Move(&rps[i] , 0 , font->tf_Baseline);
  236.         Text(&rps[i] , digits + i , 1);
  237.     }
  238. }
  239.  
  240. deallocate_rasters()
  241. {
  242.     register int i;
  243.  
  244.     for (i = 0; i < 10; i++) {
  245.         if (rast_count-- > 0) FreeRaster(bms[i].Planes[0] , 30 , 30);
  246.         if (rast_count-- > 0) FreeRaster(bms[i].Planes[1] , 30 , 30);
  247.     }
  248. }
  249.  
  250. scrollin(i , rp , begx , begy , dy , dx)
  251. struct RastPort *rp;
  252. {
  253.     int counter;
  254.  
  255.     for (counter = 0; counter < dy; counter++) {
  256.         ScrollRaster(rp,0,1,begx,begy,begx+dx,begy+dy);
  257.         ClipBlit(&rps[i],0,counter,rp,begx,begy+dy,dx,1,0xC0);
  258.         Delay(4);
  259.     }
  260. }
  261.  
  262.